りおんクロニクル


C# LINQ 実務パターン集|検索・集計・グループ化・JOIN・高速化まで総まとめ【2026年版】

Home【2026年版】C# / .NET入門と実践ガイド|基礎・業務アプリ開発・SQLite連携まで体系的に解説

LINQは C# の業務アプリで最も使われる機能のひとつです。 しかし、実務では 「よく使うパターン」 が決まっています。 この記事では、現場で毎日使う LINQ の実務パターンを体系的にまとめました。

この記事でわかること
・検索(Where)
・変換(Select)
・ソート(OrderBy)
・グループ化(GroupBy)
・JOIN(内部/左外部)
・Distinct・重複排除
・集計(Sum/Count/Max/Min)
・辞書化(ToDictionary)
・存在チェック(Any/All)
・高速化テクニック(遅延実行の罠)

1. Where(検索)

■ 1-1. 単純条件

var adults = users.Where(x => x.Age >= 20);

■ 1-2. 複数条件

var result = users.Where(x => x.Age >= 20 && x.IsActive);

■ 1-3. 部分一致(Contains)

var result = users.Where(x => x.Name.Contains("山"));

2. Select(変換)

■ 2-1. プロパティ抽出

var names = users.Select(x => x.Name);

■ 2-2. 匿名型に変換

var list = users.Select(x => new { x.Id, x.Name });

■ 2-3. DTOに変換

var dtos = users.Select(x => new UserDto(x.Id, x.Name));

3. OrderBy(ソート)

■ 3-1. 昇順

var sorted = users.OrderBy(x => x.Age);

■ 3-2. 降順

var sorted = users.OrderByDescending(x => x.CreatedAt);

■ 3-3. 複数キー

var sorted = users
    .OrderBy(x => x.Department)
    .ThenBy(x => x.Name);

4. GroupBy(グループ化)

■ 4-1. 部署ごとにグループ化

var groups = users.GroupBy(x => x.Department);

■ 4-2. グループごとに集計

var result = users
    .GroupBy(x => x.Department)
    .Select(g => new
    {
        Department = g.Key,
        Count = g.Count(),
        AvgAge = g.Average(x => x.Age)
    });

5. JOIN(内部結合 / 左外部結合)

■ 5-1. 内部結合(Inner Join)

var result =
    from u in users
    join d in departments on u.DepartmentId equals d.Id
    select new { u.Name, Department = d.Name };

■ 5-2. 左外部結合(Left Join)

var result =
    from u in users
    join d in departments on u.DepartmentId equals d.Id into gj
    from d in gj.DefaultIfEmpty()
    select new { u.Name, Department = d?.Name ?? "未所属" };

6. Distinct(重複排除)

■ 6-1. 単純な重複排除

var uniqueNames = users.Select(x => x.Name).Distinct();

■ 6-2. 複数キーで重複排除

var unique = users
    .GroupBy(x => new { x.Name, x.Age })
    .Select(g => g.First());

7. 集計(Sum / Count / Max / Min / Average)

■ 7-1. 合計

var total = orders.Sum(x => x.Amount);

■ 7-2. 最大・最小

var max = users.Max(x => x.Age);
var min = users.Min(x => x.Age);

■ 7-3. 平均

var avg = users.Average(x => x.Age);

8. ToDictionary(辞書化)

■ 8-1. ID → User の辞書

var dict = users.ToDictionary(x => x.Id);

■ 8-2. キー重複に注意

重複すると例外が出るため、GroupByで吸収する:

var dict = users
    .GroupBy(x => x.Id)
    .ToDictionary(g => g.Key, g => g.First());

9. Any / All(存在チェック)

■ 9-1. 存在チェック

if (users.Any(x => x.Id == id)) { ... }

■ 9-2. 全件が条件を満たすか

bool allAdult = users.All(x => x.Age >= 20);

10. First / FirstOrDefault の使い分け

■ 10-1. First(空だと例外)

var user = users.First(x => x.Id == id);

■ 10-2. FirstOrDefault(空なら null)

var user = users.FirstOrDefault(x => x.Id == id);

実務では FirstOrDefault が安全

11. LINQ 高速化テクニック(遅延実行の罠)

■ 11-1. ToList() を早めに呼ぶ

LINQ は遅延実行のため、 同じクエリを複数回評価して遅くなることがある。

var list = users.Where(x => x.Age >= 20).ToList(); // 1回で確定

■ 11-2. Where → ToList → Select の連続は遅い

1回のクエリにまとめる:

var names = users
    .Where(x => x.Age >= 20)
    .Select(x => x.Name)
    .ToList();

■ 11-3. 大量データは for が最速

LINQ は可読性重視。 10万件以上の処理は for の方が速い。

12. 業務アプリ向けベストパターンまとめ

まとめ:LINQは“パターンで覚える”と実務が圧倒的に速くなる

「LINQをもっと使いこなしたい」「現場で使える書き方を知りたい」 というニーズに対して、この記事のパターンはすべて即戦力です。 あなたのプロジェクトに合わせて最適なLINQ設計を組み立ててみてください。

前のページ  次のページ